/*
 *  Copyright 2008 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.mybatis.generator.api;

import java.util.List;
import java.util.Properties;

import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.Context;

/**
 * This interface defines methods that will be called at different times during
 * the code generation process. These methods can be used to extend or modify
 * the generated code. Clients may implement this interface in its entirety, or
 * extend the PluginAdapter (highly recommended).
 * <p>
 * Plugins have a lifecycle. In general, the lifecycle is this:
 * 
 * <ol>
 * <li>The setXXX methods are called one time</li>
 * <li>The validate method is called one time</li>
 * <li>The initialized method is called for each introspected table</li>
 * <li>The clientXXX methods are called for each introspected table</li>
 * <li>The providerXXX methods are called for each introspected table</li>
 * <li>The modelXXX methods are called for each introspected table</li>
 * <li>The sqlMapXXX methods are called for each introspected table</li>
 * <li>The contextGenerateAdditionalJavaFiles(IntrospectedTable) method is
 * called for each introspected table</li>
 * <li>The contextGenerateAdditionalXmlFiles(IntrospectedTable) method is called
 * for each introspected table</li>
 * <li>The contextGenerateAdditionalJavaFiles() method is called one time</li>
 * <li>The contextGenerateAdditionalXmlFiles() method is called one time</li>
 * </ol>
 * 
 * Plugins are related to contexts - so each context will have its own set of
 * plugins. If the same plugin is specified in multiple contexts, then each
 * context will hold a unique instance of the plugin.
 * <p>
 * Plugins are called, and initialized, in the same order they are specified in
 * the configuration.
 * <p>
 * The clientXXX, modelXXX, and sqlMapXXX methods are called by the code
 * generators. If you replace the default code generators with other
 * implementations, these methods may not be called.
 * 
 * @author Jeff Butler
 * @see PluginAdapter
 * 
 */
public interface Plugin {
	public enum ModelClassType {
		PRIMARY_KEY, BASE_RECORD, RECORD_WITH_BLOBS
	}

	/**
	 * Set the context under which this plugin is running
	 * 
	 * @param context
	 */
	void setContext(Context context);

	/**
	 * Set properties from the plugin configuration
	 * 
	 * @param properties
	 */
	void setProperties(Properties properties);

	/**
	 * This method is called just before the getGeneratedXXXFiles methods are
	 * called on the introspected table. Plugins can implement this method to
	 * override any of the default attributes, or change the results of database
	 * introspection, before any code generation activities occur. Attributes
	 * are listed as static Strings with the prefix ATTR_ in IntrospectedTable.
	 * <p>
	 * A good example of overriding an attribute would be the case where a user
	 * wanted to change the name of one of the generated classes, change the
	 * target package, or change the name of the generated SQL map file.
	 * <p>
	 * <b>Warning:</b> Anything that is listed as an attribute should not be
	 * changed by one of the other plugin methods. For example, if you want to
	 * change the name of a generated example class, you should not simply
	 * change the Type in the <code>modelExampleClassGenerated()</code> method.
	 * If you do, the change will not be reflected in other generated artifacts.
	 * 
	 * @param introspectedTable
	 */
	void initialized(IntrospectedTable introspectedTable);

	/**
	 * This method is called after all the setXXX methods are called, but before
	 * any other method is called. This allows the plugin to determine whether
	 * it can run or not. For example, if the plugin requires certain properties
	 * to be set, and the properties are not set, then the plugin is invalid and
	 * will not run.
	 * 
	 * @param warnings
	 *            add strings to this list to specify warnings. For example, if
	 *            the plugin is invalid, you should specify why. Warnings are
	 *            reported to users after the completion of the run.
	 * @return true if the plugin is in a valid state. Invalid plugins will not
	 *         be called
	 */
	boolean validate(List<String> warnings);

	/**
	 * This method can be used to generate any additional Java file needed by
	 * your implementation. This method is called once, after all other Java
	 * files have been generated.
	 * 
	 * @return a List of GeneratedJavaFiles - these files will be saved with the
	 *         other files from this run.
	 */
	List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles();

	/**
	 * This method can be used to generate additional Java files needed by your
	 * implementation that might be related to a specific table. This method is
	 * called once for every table in the configuration.
	 * 
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return a List of GeneratedJavaFiles - these files will be saved with the
	 *         other files from this run.
	 */
	List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable);

	/**
	 * This method can be used to generate any additional XML file needed by
	 * your implementation. This method is called once, after all other XML
	 * files have been generated.
	 * 
	 * @return a List of GeneratedXmlFiles - these files will be saved with the
	 *         other files from this run.
	 */
	List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles();

	/**
	 * This method can be used to generate additional XML files needed by your
	 * implementation that might be related to a specific table. This method is
	 * called once for every table in the configuration.
	 * 
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return a List of GeneratedXmlFiles - these files will be saved with the
	 *         other files from this run.
	 */
	List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles(IntrospectedTable introspectedTable);
	
	/**
	 * This method can be used to generate any additional Java file needed by
	 * your implementation. This method is called once, after all other Java
	 * files have been generated.
	 * 
	 * @return a List of GeneratedJavaFiles - these files will be saved with the
	 *         other files from this run.
	 */
	List<GeneratedJavaScriptFile> contextGenerateAdditionalJavaScriptFiles();

	/**
	 * This method can be used to generate additional Java files needed by your
	 * implementation that might be related to a specific table. This method is
	 * called once for every table in the configuration.
	 * 
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return a List of GeneratedJavaFiles - these files will be saved with the
	 *         other files from this run.
	 */
	List<GeneratedJavaScriptFile> contextGenerateAdditionalJavaScriptFiles(IntrospectedTable introspectedTable);

	/**
	 * This method is called when the entire client has been generated.
	 * Implement this method to add additional methods or fields to a generated
	 * client interface or implementation.
	 * 
	 * @param interfaze
	 *            the generated interface if any, may be null
	 * @param topLevelClass
	 *            the generated implementation class if any, may be null
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the interface should be generated, false if the generated
	 *         interface should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the countByExample method has been generated
	 * in the client implementation class.
	 * 
	 * @param method
	 *            the generated countByExample method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByExample method has been generated
	 * in the client implementation class.
	 * 
	 * @param method
	 *            the generated deleteByExample method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByPrimaryKey method has been
	 * generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated deleteByPrimaryKey method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insert method has been generated in the
	 * client implementation class.
	 * 
	 * @param method
	 *            the generated insert method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientInsertMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insert selective method has been generated
	 * in the client implementation class.
	 * 
	 * @param method
	 *            the generated insert method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientInsertSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithBLOBs method has been
	 * generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated selectByExampleWithBLOBs method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithoutBLOBs method has
	 * been generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated selectByExampleWithoutBLOBs method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByPrimaryKey method has been
	 * generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated selectByPrimaryKey method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientSelectByPrimaryKeyMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleSelective method has been
	 * generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated updateByExampleSelective method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithBLOBs method has been
	 * generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated updateByExampleWithBLOBs method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithoutBLOBs method has
	 * been generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated updateByExampleWithoutBLOBs method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeySelective method has
	 * been generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeySelective method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeyWithBLOBs method has
	 * been generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeyWithBLOBs method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeyWithoutBLOBs method has
	 * been generated in the client implementation class.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeyWithBLOBs method
	 * @param topLevelClass
	 *            the partially implemented client implementation class. You can
	 *            add additional imported classes to the implementation class if
	 *            necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the countByExample method has been generated
	 * in the client interface.
	 * 
	 * @param method
	 *            the generated countByExample method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientCountByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByExample method has been generated
	 * in the client interface.
	 * 
	 * @param method
	 *            the generated deleteByExample method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientDeleteByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByPrimaryKey method has been
	 * generated in the client interface.
	 * 
	 * @param method
	 *            the generated deleteByPrimaryKey method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insert method has been generated in the
	 * client interface.
	 * 
	 * @param method
	 *            the generated insert method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientInsertMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insert selective method has been generated
	 * in the client interface.
	 * 
	 * @param method
	 *            the generated insert method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientInsertSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithBLOBs method has been
	 * generated in the client interface.
	 * 
	 * @param method
	 *            the generated selectByExampleWithBLOBs method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithoutBLOBs method has
	 * been generated in the client interface.
	 * 
	 * @param method
	 *            the generated selectByExampleWithoutBLOBs method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByPrimaryKey method has been
	 * generated in the client interface.
	 * 
	 * @param method
	 *            the generated selectByPrimaryKey method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientSelectByPrimaryKeyMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleSelective method has been
	 * generated in the client interface.
	 * 
	 * @param method
	 *            the generated updateByExampleSelective method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithBLOBs method has been
	 * generated in the client interface.
	 * 
	 * @param method
	 *            the generated updateByExampleWithBLOBs method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithoutBLOBs method has
	 * been generated in the client interface.
	 * 
	 * @param method
	 *            the generated updateByExampleWithoutBLOBs method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeySelective method has
	 * been generated in the client interface.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeySelective method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeyWithBLOBs method has
	 * been generated in the client interface.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeyWithBLOBs method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeyWithoutBLOBs method has
	 * been generated in the client interface.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeyWithoutBLOBs method
	 * @param interfaze
	 *            the partially implemented client interface. You can add
	 *            additional imported classes to the interface if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called after the field is generated for a specific column
	 * in a table.
	 * 
	 * @param field
	 *            the field generated for the specified column
	 * @param topLevelClass
	 *            the partially implemented model class. You can add additional
	 *            imported classes to the implementation class if necessary.
	 * @param introspectedColumn
	 *            The class containing information about the column related to
	 *            this field as introspected from the database
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @param modelClassType
	 *            the type of class that the field is generated for
	 * @return true if the field should be generated, false if the generated
	 *         field should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
			IntrospectedTable introspectedTable, ModelClassType modelClassType);

	/**
	 * This method is called after the getter, or accessor, method is generated
	 * for a specific column in a table.
	 * 
	 * @param method
	 *            the getter, or accessor, method generated for the specified
	 *            column
	 * @param topLevelClass
	 *            the partially implemented model class. You can add additional
	 *            imported classes to the implementation class if necessary.
	 * @param introspectedColumn
	 *            The class containing information about the column related to
	 *            this field as introspected from the database
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @param modelClassType
	 *            the type of class that the field is generated for
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType);

	/**
	 * This method is called after the setter, or mutator, method is generated
	 * for a specific column in a table.
	 * 
	 * @param method
	 *            the setter, or mutator, method generated for the specified
	 *            column
	 * @param topLevelClass
	 *            the partially implemented model class. You can add additional
	 *            imported classes to the implementation class if necessary.
	 * @param introspectedColumn
	 *            The class containing information about the column related to
	 *            this field as introspected from the database
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @param modelClassType
	 *            the type of class that the field is generated for
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType);

	/**
	 * This method is called after the primary key class is generated by the
	 * JavaModelGenerator. This method will only be called if the table rules
	 * call for generation of a primary key class.
	 * <p/>
	 * This method is only guaranteed to be called by the Java model generators.
	 * Other user supplied generators may, or may not, call this method.
	 * 
	 * @param topLevelClass
	 *            the generated primary key class
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the class should be generated, false if the generated
	 *         class should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called after the base record class is generated by the
	 * JavaModelGenerator. This method will only be called if the table rules
	 * call for generation of a base record class.
	 * <p/>
	 * This method is only guaranteed to be called by the default Java model
	 * generators. Other user supplied generators may, or may not, call this
	 * method.
	 * 
	 * @param topLevelClass
	 *            the generated base record class
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the class should be generated, false if the generated
	 *         class should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called after the record with BLOBs class is generated by
	 * the JavaModelGenerator. This method will only be called if the table
	 * rules call for generation of a record with BLOBs class.
	 * <p/>
	 * This method is only guaranteed to be called by the default Java model
	 * generators. Other user supplied generators may, or may not, call this
	 * method.
	 * 
	 * @param topLevelClass
	 *            the generated record with BLOBs class
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the class should be generated, false if the generated
	 *         class should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called after the example class is generated by the
	 * JavaModelGenerator. This method will only be called if the table rules
	 * call for generation of an example class.
	 * <p/>
	 * This method is only guaranteed to be called by the default Java model
	 * generators. Other user supplied generators may, or may not, call this
	 * method.
	 * 
	 * @param topLevelClass
	 *            the generated example class
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the class should be generated, false if the generated
	 *         class should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the SqlMap file has been generated.
	 * 
	 * @param sqlMap
	 *            the generated file (containing the file name, package name,
	 *            and project name)
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the sqlMap should be generated, false if the generated
	 *         sqlMap should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the SqlMap document has been generated. This
	 * method can be used to add additional XML elements the the generated
	 * document.
	 * 
	 * @param document
	 *            the generated document (note that this is the MyBatis
	 *            generator's internal Document class - not the w3c XML Document
	 *            class)
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the document should be generated, false if the generated
	 *         document should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins. Also, if any plugin returns false, then the
	 *         <tt>sqlMapGenerated</tt> method will not be called.
	 */
	boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the base resultMap is generated.
	 * 
	 * @param element
	 *            the generated &lt;resultMap&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapResultMapWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the countByExample element is generated.
	 * 
	 * @param element
	 *            the generated &lt;select&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapCountByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByExample element is generated.
	 * 
	 * @param element
	 *            the generated &lt;delete&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByPrimaryKey element is generated.
	 * 
	 * @param element
	 *            the generated &lt;delete&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the exampleWhereClause element is generated.
	 * 
	 * @param element
	 *            the generated &lt;sql&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapExampleWhereClauseElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the baseColumnList element is generated.
	 * 
	 * @param element
	 *            the generated &lt;sql&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapBaseColumnListElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the blobColumnList element is generated.
	 * 
	 * @param element
	 *            the generated &lt;sql&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapBlobColumnListElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insert element is generated.
	 * 
	 * @param element
	 *            the generated &lt;insert&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapInsertElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insert selective element is generated.
	 * 
	 * @param element
	 *            the generated &lt;insert&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapInsertSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the resultMap with BLOBs element is generated
	 * - this resultMap will extend the base resultMap.
	 * 
	 * @param element
	 *            the generated &lt;resultMap&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapResultMapWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByPrimaryKey element is generated.
	 * 
	 * @param element
	 *            the generated &lt;select&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExample element is generated.
	 * 
	 * @param element
	 *            the generated &lt;select&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithBLOBs element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;select&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleSelective element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;update&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithBLOBs element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;update&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithourBLOBs element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;update&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeySelective element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;update&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapUpdateByPrimaryKeySelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeyWithBLOBs element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;update&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeyWithoutBLOBs element is
	 * generated.
	 * 
	 * @param element
	 *            the generated &lt;update&gt; element
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the element should be generated, false if the generated
	 *         element should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the SQL provider has been generated. Implement
	 * this method to add additional methods or fields to a generated SQL
	 * provider.
	 * 
	 * @param topLevelClass
	 *            the generated provider
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the provider should be generated, false if the generated
	 *         provider should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

	/**
	 * This method is called when the applyWhere method has been generated in
	 * the SQL provider.
	 * 
	 * @param method
	 *            the generated applyWhere method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerApplyWhereMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the countByExample method has been generated
	 * in the SQL provider.
	 * 
	 * @param method
	 *            the generated countByExample method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the deleteByExample method has been generated
	 * in the SQL provider.
	 * 
	 * @param method
	 *            the generated deleteByExample method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the insertSelective method has been generated
	 * in the SQL provider.
	 * 
	 * @param method
	 *            the generated insertSelective method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerInsertSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithBLOBs method has been
	 * generated in the SQL provider.
	 * 
	 * @param method
	 *            the generated selectByExampleWithBLOBs method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the selectByExampleWithoutBLOBs method has
	 * been generated in the SQL provider.
	 * 
	 * @param method
	 *            the generated selectByExampleWithoutBLOBs method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleSelective method has been
	 * generated in the SQL provider.
	 * 
	 * @param method
	 *            the generated updateByExampleSelective method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithBLOBs method has been
	 * generated in the SQL provider.
	 * 
	 * @param method
	 *            the generated updateByExampleWithBLOBs method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByExampleWithoutBLOBs method has
	 * been generated in the SQL provider.
	 * 
	 * @param method
	 *            the generated updateByExampleWithoutBLOBs method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);

	/**
	 * This method is called when the updateByPrimaryKeySelective method has
	 * been generated in the SQL provider.
	 * 
	 * @param method
	 *            the generated updateByPrimaryKeySelective method
	 * @param topLevelClass
	 *            the partially generated provider class You can add additional
	 *            imported classes to the class if necessary.
	 * @param introspectedTable
	 *            The class containing information about the table as
	 *            introspected from the database
	 * @return true if the method should be generated, false if the generated
	 *         method should be ignored. In the case of multiple plugins, the
	 *         first plugin returning false will disable the calling of further
	 *         plugins.
	 */
	boolean providerUpdateByPrimaryKeySelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
			IntrospectedTable introspectedTable);
}
